package cn.scs.client;

import cn.scs.common.Config;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class Connection{

    private final Socket socket;
    private final DataInputStream in;
    private final DataOutputStream out;
    private final String host;
    private final int port;

    public Connection(String host, int port) throws IOException {
        this.host = host;
        this.port = port;
        socket = new Socket(host,port);
        socket.setSoTimeout(Config.TIME_OUT*1000);  // 设置Socket io读取/写出超时时间

        // 获取输入流和输出流
        in = new DataInputStream(socket.getInputStream());
        out = new DataOutputStream(socket.getOutputStream());
    }

    // 指定缓冲块大小
    public Connection(String host, int port, int bufferSize) throws IOException {
        this.host = host;
        this.port = port;
        socket = new Socket(host,port);
        // 定制socket
        socket.setSendBufferSize(bufferSize);
        // 获取输入流和输出流
        in = new DataInputStream(socket.getInputStream());
        out = new DataOutputStream(socket.getOutputStream());
    }



    public DataInputStream getIn() {
        return in;
    }

    public DataOutputStream getOut() {
        return out;
    }

    /**
     * write（）系列方法进行写操作时并不一定直接将所写的内容写出，
     * 而先将需要写出的内容放到输出缓冲区，
     * 只到缓冲去满、调用flush（）方法刷新流或调用close（）方法关闭流时才真正输出。
     * 这样处理可以减少实际的写出次数，提高系统效率。如果需要写出的内容立即输出，需要在完成write（）方法后调用flush（）方法刷新流，否则程序可能不能正常工作。
     * **/
    public void write(byte[] data) throws IOException {
        out.write(data);
    }
    public byte read() throws IOException{
        return in.readByte();
    }

    /**
    readInt()方法用于从此ObjectInputStream流中读取4个字节(即32位)的数据，并返回一个整数。
     **/
    public int readInt() throws IOException {
        return in.readInt();
    }
    public void writeInt(int len) throws IOException{
        out.writeInt(len);
    }

    //用于检查此流是否读取布尔值。
    public boolean readBoolean() throws IOException {
        return in.readBoolean();
    }

    //用于将给定的布尔字节写入基本输出流，因此成功执行后写入的变量计数器为加1。
    public void writeBoolean(boolean b) throws IOException {
        out.writeBoolean(b);
    }

    /**
     * 从流 in 中读取用 UTF-8 修改版格式编码的 Unicode 字符格式的字符串；
     * 然后以 String 形式返回此字符串。
     * （一般要和 writeUTF() 方法配套使用）否则会抛出异常
    * */
    public String readUTF() throws IOException {
        return in.readUTF();
    }
    /**
     * 以与机器无关方式使用 UTF-8 修改版编码将一个字符串（str）写入基础输出流。
     **/
    public void writeUTF(String str) throws IOException {
        out.writeUTF(str);
    }
    public  void writeLong(long num) throws IOException{
        out.writeLong(num);
    }
    //关闭socket对象
    public void close() throws IOException {
        socket.close();
    }
    //清空缓冲区（执行缓冲区）
    public void flush() throws IOException {
        out.flush();
    }
}
